#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
#include <cassert>
using namespace std;

void FreeChild(int signo)
{
    assert(signo == SIGCHLD);
    while (true)
    {
        //waitpid什么时候调用失败呢？
        //如果已经没有子进程了， -1：等待任意子进程
        //pid_t id = waitpid(-1, nullptr, 0);
        pid_t id = waitpid(-1, nullptr, WNOHANG);
        if (id > 0)
        {
            cout << "父进程等待成功,child pid: " << id << endl;
        }
        else if (id == 0)
        {
            cout << "还有子进程，但是现在没有完全退出，父进程需要处理自己的事情！" << endl;
            break;
        }
        else
        {
            cout << "父进程等待所有子进程结束！" << endl;
            break;
        }
    }
}
int main()
{
    //signal(SIGCHLD, FreeChild); 
    signal(SIGCHLD, SIG_IGN); 
    for (int i = 0; i < 10; i++)
    {
        pid_t id = fork();
        if (id == 0)
        {
            // 子进程
            int cnt = 10;
            
            while (cnt)
            {
                cout << "我是子进程,pid: " << getpid() << " 当前的cnt: " << cnt-- << endl;
                sleep(1);
            }
            cout << "子进程退出，进入僵尸状态!" << endl;
            exit(0);
        }
    }


    // for (int i = 0; i < 10; i++)
    // {
    //     pid_t id = fork();
    //     if (id == 0)
    //     {
    //         // 子进程
    //         int cnt = 0;
    //         if (i < 7)
    //             cnt = 5;
    //         else
    //             cnt =20;

    //         while (cnt)
    //         {
    //             cout << "我是子进程,pid: " << getpid() << " 当前的cnt: " << cnt-- << endl;
    //             sleep(1);
    //         }
    //         cout << "子进程退出，进入僵尸状态!" << endl;
    //         exit(0);
    //     }
    // }

    // for (int i = 0; i < 10; i++)
    // {
    //     pid_t id = fork();
    //     if (id == 0)
    //     {
    //         // 子进程
    //         int cnt = 10;
    //         while (cnt)
    //         {
    //             cout << "我是子进程,pid: " << getpid() << " 当前的cnt: " << cnt-- << endl;
    //             sleep(1);
    //         }
    //         cout << "子进程退出，进入僵尸状态!" << endl;
    //         exit(0);
    //     }
    // }

    //sleep(1); // 模拟父进程每隔1S创建一个子进程，并让子进程集体退出，分析父进程接收信号是否丢失？
    // //1.父进程(这种都是父进程主动等待)
    // if(waitpid(id,nullptr,0) > 0)
    // {
    //     cout<<"父进程等待子进程成功！"<<endl;
    // }

    // 2.父进程做自己的事情
    while (true)
    {
        cout << "我是父进程，我正在运行..." << getpid() << endl;
        sleep(1);
    }
    return 0;
}